package com.hxk.ioc.config;

import com.hxk.ioc.bean.Car;
import com.hxk.ioc.bean.Cat;
import com.hxk.ioc.bean.Dog;
import com.hxk.ioc.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * 将对象交由springIOC容器管理的方式二
 *      使用@Configuration+@Bean+@Scope注解将对象加载到IOC容器中，不写@Scope时默认@Scope("singleton")
 *          加载到IOC容器中的对象默认以方法名作为Bean名称
 *              如果不想用默认的以方法名为Bean名称可以@Bean(name = "aaa")来设置，如，设置bean的名为为aaa
 *     对象初始化和销毁方法的4种实现方式：
 *          1、通过@Bean指定init-method和destroy-method；
 *          2、通过实现InitializingBean和DisposableBean接口来实现初始化和销毁方法
 *          3、通过使用JSR250中的@PostConstruct和@PreDestroy注解来完成初始化和销毁方法
 *          4、通过实现BeanPostProcessor接口
                在bean初始化前后进行一些工作处理
                    postProcessBeforeInitialization:在初始化之前工作
                    postProcessAfterInitialization:在初始化之后工作
 */
@Configuration
public class MainConfigBeanScope {


    //@Scope//单实例的，ioc容器启动就会调用该方法创建对象实例并放入容器中，此注解相当于@Scope("singleton"),Spring 默认是单例作用域，在该作用域时，bean对象的整个过程都有ioc控制
    @Scope("prototype")//多实例，ioc容器启动不会调用该方法创建对象放入容器中，而是在每次获取时才会调用该方法创建对象，并且ioc容器不管理对象的销毁
    //@Scope("request")//mvc架构中，每次请求创建一个实例
    //@Scope("session")//mvc架构中，同一个session创建一个实例
    //@Bean//默认以方法名为User对象在ioc容器中的id，类型为返回值类型
    //@Bean(name = "aaa")设置User对象在ioc容器中的id为aaa，类型为返回值类型
    @Bean(initMethod = "init",destroyMethod = "destroy")//设置bean对象初始化时的初始化方法和销毁方法
    public User user(){
        return new User("zh3",18);
    }

    /**
     * 通过Car对象实现InitializingBean和DisposableBean接口来实现初始化和销毁方法
     * @return
     */
    @Bean
    public Car car(){
        return new Car();
    }

    /**
     * 通过使用JSR250中的@PostConstruct和@PreDestroy注解来完成初始化和销毁方法
     * @return
     */
    @Bean
    public Dog dog(){
        return new Dog();
    }

    /**
     * 通过实现BeanPostProcessor接口
     *  在bean初始化前后进行一些工作处理
     *      postProcessBeforeInitialization:在初始化之前工作
     * 		postProcessAfterInitialization:在初始化之后工作
     * @return
     */
    @Bean
    public Cat cat(){
        return new Cat();
    }
}
